package com.servlet.demo.filter;

import com.servlet.demo.dto.User;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法，
 * 即是否让目标资源执行
 * 在让目标资源执行之前，可以对request\response作预处理，再让目标资源执行
 * 在目标资源执行之后，可以捕获目标资源的执行结果，从而实现一些特殊的功能
 */
public class DemoFilter implements Filter {
    /**
     * 过滤器初始化
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    /**
     * 过滤程序（request和response预处理，也可以处理登陆信息session数据：比如需要验证登陆信息的页面有100个，那么久可以在这里预处理，目标是那100个页面的时候，验证用户登陆信息是否存在，如果不存在直接跳转到登陆页面）
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //对request和response进行一些预处理
        servletRequest.setCharacterEncoding("utf-8"); // 这里如果不进行预处理，那么每个servlet的中文乱码都需要单独设定编码
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-");
        // 判断url是否是需要验证用户信息的
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 设定这些连接需要进行用户信息监测
        if (request.getRequestURI().contains("/user/")) {
            // 获取session信息
            HttpSession session = request.getSession();
            // 获取session中保存的用户信息
            User user = (User) session.getAttribute("sd_user");
            // 用户信息为空说明没登录
            if (user == null) {
                response.sendRedirect(request.getContextPath() + "/login.jsp");
                return ;
            }
            // 用户登陆信息不为空，并且访问的是login页面，直接跳转到loginInfo.jsp页面
//            else if (user != null &&request.getRequestURI().contains("/login.jsp")) {
//                response.sendRedirect(request.getContextPath() + "/loginInfo.jsp");
//            }
        }
        // 目标资源放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    /**
     * 过滤器销毁
     */
    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}
